package com.sakura.singleton.type03;

/**
 * //TODO 懒汉式(静态变量) 线程不安全
 *        why?
 *        原因在下面
 *
 * TODO 优缺点说明：
 * TODO 1) 起到了Lazy Loading的效果，但是只能在单线程下使用。
 * TODO 2) 如果在多线程下，一个线程进入了if (singleton == null)判断语句块，还未来得及
 *         往下执行，另一个线程也通过了这个判断语句，这时便会产生多个实例。所以
 *         在多线程环境下不可使用这种方式
 * TODO 3) 结论：在实际开发中，不要使用这种方式.
 *
 * @Author Sakura
 * @Date 2022/11/9 16:02
 * @Version 1.0
 */
public class SingletonTest03 {
    public static void main(String[] args) {
        System.out.println("懒汉式(静态变量)， 线程不安全~");
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance == instance2); // true
        System.out.println("instance.hashCode=" + instance.hashCode());
        System.out.println("instance2.hashCode=" + instance2.hashCode());
    }
}
class Singleton {
    private static Singleton instance;

    private Singleton() {}

    //TODO 提供一个静态的公有方法，当使用到该方法时，才去创建 instance
    //即懒汉式
    public static Singleton getInstance() {
        /**
         *  //TODO 在多线程模式下
         *         线程一恰好执行到if判断逻辑,且正在执行
         *         线程二正好也执行到if判断,此时线程一正在执行if语句中的内容;导致if判断成立,线程二也来执行if中的语句
         *         此时就会创建多个示例对象；存在线程安全问题
         */
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}